package org.japo.java.entities;

public class Color {

    // Limites de nivel
    public static final int NIV_MIN = 0;
    public static final int NIV_MAX = 255;

    // Variables
    private int r;
    private int v;
    private int a;

    // Constructor predeterminado
    public Color() {
    }

    // Constructor parametrizado
    public Color(int r, int v, int a) {
        if (validarColor(r, v, a)) {
            this.r = r;
            this.v = v;
            this.a = a;
        }
    }

    // --- Inicio encapsulación
    //
    public int getR() {
        return r;
    }

    public void setR(int r) {
        if (validarColor(r, v, a)) {
            this.r = r;
        }
    }

    public int getV() {
        return v;
    }

    public void setV(int v) {
        if (validarColor(r, v, a)) {
            this.v = v;
        }
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        if (validarColor(r, v, a)) {
            this.a = a;
        }
    }

    // --- Fin encapsulación
    //
    public void mostrarColor() {
        System.out.println(toString());
    }

    public static boolean validarColor(int r, int v, int a) {
        return r >= NIV_MIN && r <= NIV_MAX
                && v >= NIV_MIN && v <= NIV_MAX
                && a >= NIV_MIN && a <= NIV_MAX;
    }

    // --- Inicio de sobrecarga de métodos
    //
    @Override
    public String toString() {
        String cR = "0" + Integer.toHexString(this.r);
        cR = cR.substring(cR.length() - 2);
        String cV = "0" + Integer.toHexString(this.v);
        cV = cV.substring(cV.length() - 2);
        String cA = "0" + Integer.toHexString(this.a);
        cA = cA.substring(cA.length() - 2);
        return String.format("#%s%s%s", cR, cV, cA).toUpperCase();
    }

    @Override
    public boolean equals(Object o) {
        boolean testOK;

        if (o == null) {
            testOK = false;
        } else if (!(o instanceof Color)) {
            testOK = false;
        } else {
            Color color = (Color) o;
            testOK = this.r == color.r
                    && this.v == color.v
                    && this.a == color.a;
        }

        return testOK;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 83 * hash + this.r;
        hash = 83 * hash + this.v;
        hash = 83 * hash + this.a;
        return hash;
    }
}
